package interfaz;

import java.awt.EventQueue;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.plaf.ToolTipUI;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;

import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.CompoundBorder;

import java.awt.FlowLayout;

import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.BevelBorder;

import leeFunciones.LeeFunciones;

import javax.swing.JScrollPane;

import java.awt.Panel;

import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;

public class Interfaz {

	private JFrame frame;
	private JTextField txtPath;
	private File file = null;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Interfaz window = new Interfaz();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Interfaz() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {

		frame = new JFrame();
		frame.setBounds(100, 100, 589, 716);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);

		final String STR_TOOL_TIP_FUNCIONES = "Una vez seleccionado el archivo fuente, elija una de las funciones de la lista para efectuar el analisis.";
		final String STR_TOOL_TIP_CUERPO = "Codigo del metodo seleccionado.";
		final String STR_TOOL_TIP_SELECT_FILE = "Seleccione un archivo fuente para analizar.";
		final String STR_TOOL_TIP_PANEL = "Resultados del analisis.";

		JPanel panel = new JPanel();
		panel.setBounds(0, 0, 581, 36);
		FlowLayout flowLayout = (FlowLayout) panel.getLayout();
		flowLayout.setAlignment(FlowLayout.LEFT);
		panel.setBorder(new CompoundBorder());
		frame.getContentPane().add(panel);

		txtPath = new JTextField();
		txtPath.setEditable(false);
		txtPath.setHorizontalAlignment(SwingConstants.CENTER);
		panel.add(txtPath);
		txtPath.setColumns(35);
		txtPath.setToolTipText(STR_TOOL_TIP_SELECT_FILE);

		JButton btnNewButton = new JButton("Seleccionar Archivo");
		btnNewButton.setToolTipText(STR_TOOL_TIP_SELECT_FILE);

		panel.add(btnNewButton);

		JLabel label = new JLabel("Funciones");
		label.setBounds(10, 40, 100, 16);
		label.setToolTipText(STR_TOOL_TIP_FUNCIONES);
		frame.getContentPane().add(label);

		final JScrollPane scrollLilst = new JScrollPane();
		scrollLilst.setBounds(12, 70, 180, 321);
		final JList lstFunciones = new JList();
		scrollLilst.setViewportView(lstFunciones);
		lstFunciones.setToolTipText(STR_TOOL_TIP_FUNCIONES);

		frame.getContentPane().add(scrollLilst);

		final JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 403, 557, 267);

		frame.getContentPane().add(scrollPane);

		final JTextArea txtCuerpoFuncion = new JTextArea();
		txtCuerpoFuncion.setToolTipText(STR_TOOL_TIP_CUERPO);
		txtCuerpoFuncion.setEditable(false);
		scrollPane.setViewportView(txtCuerpoFuncion);
		txtCuerpoFuncion.setTabSize(2);
		txtCuerpoFuncion.setBorder(new BevelBorder(BevelBorder.LOWERED, null,
				null, null, null));
		txtCuerpoFuncion.setRows(10);

		JPanel panel_1 = new JPanel();
		panel_1.setBounds(224, 116, 285, 196);
		panel_1.setToolTipText(STR_TOOL_TIP_PANEL);
		frame.getContentPane().add(panel_1);
		panel_1.setLayout(new FormLayout(new ColumnSpec[] {
				FormFactory.RELATED_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC,
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("default:grow"), }, new RowSpec[] {
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, }));

		final JLabel lblLineasDeCodigo = new JLabel("Lineas de Codigo:");
		panel_1.add(lblLineasDeCodigo, "2, 2, left, default");

		final JLabel lblLineasDeComentario = new JLabel("Linea de Comentario:");
		lblLineasDeComentario.setHorizontalAlignment(SwingConstants.RIGHT);
		panel_1.add(lblLineasDeComentario, "2, 4, left, default");

		final JLabel lblPorcentaje = new JLabel(
				"Porcentaje de lineas comentadas:");
		lblPorcentaje.setHorizontalAlignment(SwingConstants.RIGHT);
		panel_1.add(lblPorcentaje, "2, 6, left, default");

		final JLabel lblCiclomatico = new JLabel("Nro. Ciclomático:");
		lblCiclomatico.setHorizontalAlignment(SwingConstants.RIGHT);
		panel_1.add(lblCiclomatico, "2, 8, left, default");

		final JLabel lblNodosCondicion = new JLabel("(Nodos Condicion)");
		panel_1.add(lblNodosCondicion, "2, 10, left, default");

		final JLabel lblFanIn = new JLabel("Fan In:");
		lblFanIn.setHorizontalAlignment(SwingConstants.RIGHT);
		panel_1.add(lblFanIn, "2, 12, left, default");

		final JLabel lblFanOut = new JLabel("Fan Out:");
		lblFanOut.setHorizontalAlignment(SwingConstants.RIGHT);
		panel_1.add(lblFanOut, "2, 14, left, default");

		final JLabel lblLongitud = new JLabel("Longitud Halstead:");
		lblLongitud.setHorizontalAlignment(SwingConstants.RIGHT);
		panel_1.add(lblLongitud, "2, 16, left, default");

		final JLabel lblVolumen = new JLabel("Volumen Halstead:");
		lblVolumen.setHorizontalAlignment(SwingConstants.RIGHT);
		panel_1.add(lblVolumen, "2, 18, left, default");

		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				JFileChooser chooser = new JFileChooser();
				FileFilter filter = new FileFilter() {

					@Override
					public String getDescription() {
						// TODO Auto-generated method stub
						return "Java Files";
					}

					@Override
					public boolean accept(File f) {
						if (f.isDirectory()) {
							return true;
						}
						if (f.getName().contains("java"))
							return true;

						return false;
					}
				};
				chooser.setFileFilter(filter);
				int returnValue = chooser.showOpenDialog(null);
				if (returnValue == JFileChooser.APPROVE_OPTION) {
					file = chooser.getSelectedFile();
				}
				if (file != null) {

					txtPath.setText(file.getPath());

					try {
						lstFunciones.setListData((LeeFunciones
								.getFunciones(file).toArray()));
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			}
		});

		lstFunciones.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent listSelectionEvent) {
				if (listSelectionEvent.getValueIsAdjusting()) {
					// System.out.print("Selected Value: "
					// + lstFunciones.getSelectedValue());

					txtCuerpoFuncion.setText(LeeFunciones.getCuerpoFuncion(
							new File(txtPath.getText()), lstFunciones
									.getSelectedValue().toString()));

					Integer loc = LeeFunciones
							.getLineasDeCodigo(txtCuerpoFuncion.getText());
					Integer comentarios = LeeFunciones
							.getLineasDeComentario(txtCuerpoFuncion.getText());
					lblLineasDeCodigo.setText("Lineas de codigo:" + loc);
					lblLineasDeComentario.setText("Lineas de Comentario:"
							+ comentarios);

					Integer porcentaje;
					if (comentarios == 0) {
						porcentaje = 0;
					} else {
						porcentaje = (comentarios * 100) / loc;
					}
					lblPorcentaje.setText("Porcentaje de lineas comentadas:%"
							+ porcentaje);

					LeeFunciones.aplicarNroCiclomatico(txtCuerpoFuncion
							.getText());
					lblCiclomatico.setText("Nro. Ciclomático:"
							+ LeeFunciones.getNroCiclomatico());

					String nodosCondicion = LeeFunciones.getNodosCondicion();
					if (nodosCondicion.equals("")) {

						nodosCondicion = "(No se encontraron nodos Condicion)";
					}
					lblNodosCondicion.setText(nodosCondicion);

					lblFanIn.setText("Fan In:"
							+ LeeFunciones.getFanIn(txtCuerpoFuncion.getText(),
									lstFunciones));
					lblFanOut.setText("Fan Out:"
							+ LeeFunciones.getFanOut(file, lstFunciones
									.getSelectedValue().toString()));

					LeeFunciones.aplicarHalstead(txtCuerpoFuncion.getText());
					lblLongitud.setText("Longitud Halstead:"
							+ LeeFunciones.getLongitud());
					lblVolumen.setText("Volumen Halstead:"
							+ LeeFunciones.getVolumen());

					SwingUtilities.invokeLater(new Runnable() {
						public void run() {
							scrollPane.getViewport().setViewPosition(
									new java.awt.Point(0, 0));
						}
					});
				}
			}
		});

	}
}
